跳到主要内容

chmod 命令与文件权限系统

前言

在 Linux 中,文件权限、属性和所有者权限控制着整个系统进程和用户对文件的访问级别。这样可以确保只有授权的用户和进程才能访问特定的文件和目录。

权限系统

基本的 Linux 权限模型是通过将系统文件与所有者和组进行关联起来,并分别为三类不同的用户分配权限访问来工作,分别是:文件归属者、组以及其他用户(其他用户指的是除了文件归属者及组之外的所有用户,即 Everyone)。

文件所属者权限可以使用 chown 命令或者 chgrp 命令进行修改。 这里主要说明权限设置,即 chmod 命令,该命令的全称是 change file modes or Access Control Lists。

而文件又有三种权限,分别是 读 权限、写 权限和 执行 权限。

这个权限允许使用者(或者管理员)控制哪些用户可以读取文件、写入文件以及执行文件。

对于一个文件有哪些权限,我们可以通过 ls 命令进行查看,示例:

$ ls -l file_name

下面是使用该命令输出的示例结果:

-rw-r--r-- 12 linuxize users 12.0K Apr  28 10:10 file_name
|[-][-][-]- [------] [---]
| | | | | | |
| | | | | | +-----------> 7. Group
| | | | | +-------------------> 6. Owner
| | | | +--------------------------> 5. Alternate Access Method
| | | +----------------------------> 4. Others Permissions
| | +-------------------------------> 3. Group Permissions
| +----------------------------------> 2. Owner Permissions
+------------------------------------> 1. File Type

第一个字符表示的是文件类型(如示例中的是 -),文件类型主要有三种,分别是:文件(使用 - 字符表示)、文件夹(使用 d 字符表示)以及符号链接(使用 l 字符表示)。

之后的九个字符表示文件权限,三个为一组,一共三组(一般叫三元组):

  1. 第一组表示文件所属者权限(示例中为 rw-),
  2. 第二组表示组权限(示例中为 r--),
  3. 最后一组表示其他用户权限(示例中为 r--)。

在上面的文件权限示例中(rw-r--r--)主要含义是:文件归属者具有读写权限(rw),归属者所在的以及其他用户只有读(r)权限。

根据文件类型,文件权限相应的具有不同的含义。这三个权限三元组中的每一个都可以由以下字符构成,并根据它们是被设置为文件还是目录而产生不同的效果:

权限在文件上的作用

如果在文件上,相应的权限如下所示:

权限字符含义
-表示用户无读权限,禁止用户读取文件中的内容
r表示用户具有读权限
-表示用户无写权限,禁止用户进行写或者修改操作。
w表示用户有写权限
执行-表示用户没有执行文件权限
x表示用户可以执行文件
s如果在用户权限或者组权限中有该字符,就表示设置了 x 标志(如果在用户权限中找到该字符,会设置一个相应的 setuid。同理,如果在组权限中找到该字符,相应的会设置一个 setgid
Ss 字符相同,但是没有设置 x 标识。这个标识很少用在文件上
t这个字符主要是设置在其他用户权限中,会设置一个 sticky 标志位,该字符对文件没卵用
Tt 相同,但是没有设置 x 标志。这个标志对文件没用

权限在目录上的影响

如果在文件夹上,相应的权限如下所示:

权限字符含义
-无法显示目录中的内容
r可以查看目录中的内容(比如使用 ls 命令查看文件夹下的内容)
-无法修改目录(比如重命名)
w允许对目录进行写操作(比如删除或者重命名目录)
执行-表示不能改变目录
x可以使用 cd 命令进入目录
s如果在用户权限或者组权限中有该字符,就表示设置了 x  标志(如果在用户权限中找到该字符,会设置一个相应的 setuid ;同理,如果在组权限中找到该字符,相应的会设置一个 setgid )。

在目录上设置 setgid 标志时,在其中创建的新文件将继承目录ID( GID ),而不是此件改文件的用户所在组的ID。
Ss 字符相同,但是没有设置 x 标识。但是该字符对目录没卵用
t这个字符主要是设置在其他用户权限中,会设置一个 sticky 标志位。当设置在目录上时,仅仅文件、目录所有者或者超级管理员才能删除或重命名文件。
Tt  相同,但是没有设置 x 标志。但是对目录没卵用

修改文件权限

我们可以使用 chmod 命令修改文件权限,不过想要修改文件权限必须使用 root 用户或者具有 sudo 权限的用户才能够修改。使用 chmod 命令一定要小心,特别是在递归更改权限时(使用 -R 参数表示递归修改) 。另外,该命令可以接受一个或多个以空格分隔的文件或目录最为参数。

修改权限时可以使用符号模式、数值模式或者引用文件三种模式进程设置权限。

基本的命令格式如下:

chmod [option] mode file ...

可选参数可使用 man chmod 命令进行查看,不过一般使用递归修改文件权限的场景比较多(-R 参数),即:

chmod -R mode file ...

使用符号模式修改文件权限(推荐)

使用符号模式修改文件权限的 chmod 命令的语法格式如下:

chmod [OPTIONS] [ugoa…][-+=]perms…[,…] FILE...

第一组 [ugoa…] 表示的是用户标志,主要用户定义哪些用户,文件权限修改时其实就是作用于这些用户:

  • u:文件所属者用户
  • g:指定的组
  • o:其他用户(即 Everyone
  • a:所有用户

注意: 在修改权限时如果省略了用户标志,则默认为 a (即所有用户)。

第二组 [-+=] 表示操作标志,定义权限是否要删除、添加或设置:

  • -:删除指定权限
  • +:增加指定权限
  • =:将当前权限更改为指定的权限(移除其他所有权限)。如果在 = 号之后没有设置授予权限,则删除指定用户的所有权限

第三组 perms 就是指定设置的权限。可以使用以下零个、一个或者多个字母来显示设置:

r w x X s t

注意: 当要为多个用户设置权限时,使用英文逗号(不要使用空格)分隔符模式进行区分。

下面是使用符号模式修改权限的一些示例:

  • 给用户所在的组设置执行(x)权限,不设置读写权限:
$ sudo chmod g=x file_name other_file
  • 移除文件上所有用户的写权限:
$ sudo chmod a-w file_name other_file
  • 强制删除其他用户的执行权限(利用递归 -R 参数修改指定目录下的所有文件):
$ sudo chmod -R o-x dir_name other_dir
  • 移除组、其他用户的读写和执行权限:
$ sudo chmod og-rwx file_name other_file

也可以使用下面的命令达到相同的效果:

$ sudo chmod og= file_name other_file
  • 给用户设置读写和执行权限、组仅设置读权限、移除其他用户的所有权限:
$ sudo chmod u=rwx,g=r,o= file_name  other_file

使用数值模式修改文件权限

使用数值模式修改文件权限的 chmod 命令的语法格式如下:

chmod [OPTIONS] NUMBER FILE...

当使用数字模式时,我们可以同时设置三个用户类的(所有者、组合其他用户)权限。

使用数字设置权限时,权限号码可以是3位或者4位。

当是3位数字时:第一位表示文件所有者权限,第二位表示文件所属组的权限,最后一位表示其他用户的权限。

读写执行对应的数字如下:

  • r (read) = 4
  • w (write) = 2
  • x (execute) = 1
  • no permissions = 0

一个用户有哪些权限由该组的权限之和表示。

要在数值模式下找出文件的权限,只需要计算所有用户类的总数。例如,要想给文件所有者授予读写和执行权限、给组设置读和执行权限、给其他用户只设置读权限,只需要执行如下操作即可:

  • Owner: rwx = 4+2+1=7
  • Group: r-x = 4+0+1=5
  • Others: r-x = 4+0+0=4

使用上面的方法,我们就得到一个 754,这三位数值即表示我们所需要的权限,命令如下:

$ sudo chmod 754 file_name

如果想要利用 setuidsetgidsticky 位标志进行设置权限,我们就需要使用四位数字进行表示:

  • setuid = 4
  • setgid = 2
  • sticky = 1
  • no changes = 0

如果第一个数字是0,可以省略,并且模式可以用3个数字表示,即 0754 和 754 含义相同。

要计算数值模型,可以使用另一种方法(二进制方法)。但利用这种计算方式稍微复杂一些,对于大多数用户来说,知道如何使用 4、2、和 1 计算就足够了。

下面是使用数值模式修改权限的一些示例:

  • 给所有者读写权限、但是仅仅给组合其他用户读权限:
$ chmod 644 file_name
  • 给所有者读写和执行权限、给组读和执行权限但是不给其他用户任何权限:
$ chmod 750 file_name
  • 给所有用户读写和执行权限并设置一个 sticky 位:
$ chmod 1777 dir_name
  • 使用递归模式修改目录权限:给所有者读写和执行权限、不给组和其他用户任何权限:
$ chmod -R 700 dir_name

结束语

在 Linux 中,使用文件权限、属性和所有权来限制用户对文件的访问。而文件的权限我们一般都是使用 chmod 命令进行修改,在修改权限时主要有两种:符号模式和数值模式。

个人更推荐使用符号模式,因为该模式修改权限时更加直观,想要给用户增加权限时只需要使用 u+ 即可。反过来,使用数值模式必须要最少写三位数值,还不够直观。

当然,实际使用中还是看个人喜好吧~

--

https://linuxize.com